package com.iatinspur.service.iml;

import com.iatinspur.dubbo.service.ProviderStreamService;
import org.apache.dubbo.common.stream.StreamObserver;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.remoting.exchange.Response;

import java.text.MessageFormat;
import java.util.UUID;


/**
 * java defalut 方法
 *  相同点
 *    1.接口允许存在static与default的方法体
 *  不同
 *    1.static是静态方法，default还是个成员方法
 *       这里有个【interface.super.(default)Methed】写法 类似this.supper.Methed
 *  场景使用
 *   【向后兼容】      只用改一个接口  一个具体实现类 其他实现类不会动到
 *   【提供便利方法】   定义一个抽象方法 删除一条数据 这个交给别人实现，自己有个清空方法 直接调删除方法
 *   【增强接口的功能】
 *   【行为的默认实现】
 *   【多重继承问题的解决方案】
 */
@DubboService(version = "1.0.0")
public class ProviderStreamServiceIml implements ProviderStreamService {
    private String name = "碧飞";
    /**
     * 这是个异步方法，每到一个进度就会给客户端一个回复
     *     StreamObserver<String> 有三个方法
     *     1.给客户端响应
     *     void onNext(T data);
     *     2.向客户端发异常
     *     void onError(Throwable throwable);
     *     3.告诉客户端结束了
     *     void onCompleted();
     * @param param
     * @param response
     */
    @Override
    public void dubboServerStream(String param, StreamObserver<String> response) {
        System.err.println(this.name+"说:有人调用我");
        String pattern="【{0}说:收到{1}，开始执行步骤{2}】";
        for (int i =1 ;i<5;i++){
            System.err.println(this.name+"说:有人调用我"+i);
            response.onNext(MessageFormat.format(pattern,this.name,param,i));
            doProcess();
        }
        response.onNext(MessageFormat.format(pattern,this.name,param,"(完毕)"));
        response.onCompleted();
    }

    @Override
    public StreamObserver<String> dubboClientStream(StreamObserver<String> response) {
        String requestPattern="【{0}收到:{1}，开始处理】";
        String responsePattern="【{0}收到:{1}，处理完成，返回结果{2}】";
        final String myName = this.name;
        return new StreamObserver<String>() {
            @Override
            public void onNext(String data) {
                System.err.println(MessageFormat.format(requestPattern,myName,data));
                response.onNext(MessageFormat.format(responsePattern,myName,data,UUID.randomUUID().toString()));
            }

            @Override
            public void onError(Throwable throwable) {
                response.onError(new Exception());
            }

            @Override
            public void onCompleted() {
                System.err.println(myName+"收到结束，开始提醒消费者结束");
                response.onCompleted();
            }
        };
    }


    /**
     * 这个方法是提供不出去的，【因为接口没有这个方法】
     */
    private void doProcess(){
//        try {
//            Thread.sleep(2);
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
    }

}
